package org.tnc.hr.service.impl;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

import org.tnc.budget.model.BudgetCenter;
import org.tnc.hr.dao.BudgetCenterAllViewDao;
import org.tnc.hr.dao.EventAllViewDao;
import org.tnc.hr.model.EventAllView;
import org.tnc.hr.model.ExportEmailBudget;
import org.tnc.hr.model.ExportEmailSend;
import org.tnc.hr.service.HrManager;
import org.tnc.hr.util.DateUtils;

public class HrManagerImpl implements HrManager {
    
    private BudgetCenterAllViewDao budgetCenterAllViewDao;
    private EventAllViewDao eventAllViewDao;
    
    public void setBudgetCenterAllViewDao(BudgetCenterAllViewDao budgetCenterAllViewDao) {
        this.budgetCenterAllViewDao = budgetCenterAllViewDao;
    }

    public void setEventAllViewDao(EventAllViewDao eventAllViewDao) {
        this.eventAllViewDao = eventAllViewDao;
    }

    public void getSummary(Date startDate, Date endDate){
        
    }
    
    public void xx () {
        Date date = new Date();
        
        // 当月的所有天
        ArrayList<String> allDays = DateUtils.getAllDay(date);
        
        // 所有节假日
        ArrayList<String> allLevelDays = null;
        
        // 某人的所有events
        // SELECT * FROM event_all_view WHERE event_people = ?
        ArrayList<EventAllView> allEvents = null;
        
        // 初始化当月所有BudgeCenter,工时数为0
        // SELECT DISTINCT(fk_bc_id), bc_name, '0' AS hours FROM event_table e, budget_center b WHERE b.bc_id = e.fk_bc_id
        ArrayList<ExportEmailBudget> allBudgeCenter = null;
        
        // 上班时间
        String workStartTime = "9:00:00";
        // 下班时间
        String workEndTime = "17:00:00";
        
        // 当月起始日期
        Date startDayByMonth = DateUtils.getStartDateByMonth(date);
        // 当月结束日期
        Date endDayByMonth = DateUtils.getEndDateByMonth(date);
        
        // 初始化要生成Excel的model
        ArrayList<ExportEmailSend> eesList = new ArrayList<ExportEmailSend>();
        for (int i = 0; i < allDays.size(); i++) {
            ExportEmailSend ees = new ExportEmailSend();
            ees.setDay(allDays.get(i));
            ees.setDefaultHours(8f);
            ees.setBudgeList(allBudgeCenter);
            eesList.add(ees);
        }
        
        
        EventAllView eav = new EventAllView();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat sdfHMS = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        
        // 循环所有事件
        for (int i = 0; i < allEvents.size(); i++) {
            eav = allEvents.get(i);
            Date eavStartDate = DateUtils.convertDate(eav.getStartDate());
            Date eavEndDate = DateUtils.convertDate(eav.getEndDate());
            float workHours = 0;
            
            // 1、事件时间不在当月内；事件结束时间小于当月起始时间，或者事件起始时间大于当月结束时间
            if (eavEndDate.getTime() < startDayByMonth.getTime() || eavStartDate.getTime() > endDayByMonth.getTime()){
                // 抛弃
                
            }
            
            // 2、事件起始时间小于当月起始时间，事件结束时间在当月内，也就是小于当月结束时间，大于当月起始时间
            if (eavStartDate.getTime() < startDayByMonth.getTime() && eavEndDate.getTime() <= endDayByMonth.getTime() && eavEndDate.getTime() > startDayByMonth.getTime()) {
                // 工时取：当月起始时间————事件结束时间
                
                // 2.1 判断时间间隔为多少天,如果等于0，为当天工作
                if (DateUtils.getIntervalDays(startDayByMonth, eavEndDate) == 0){
                    Date tStartDate = DateUtils.convertDateHMS((sdf.format(startDayByMonth) + workStartTime));
                    Date tEndDate = DateUtils.convertDateHMS(sdfHMS.format(eavEndDate) + workEndTime);
                    
                    // 判断结束时间是否在正常工作时间内,如果工作结束时间大于正常工作时间，则取正常工作的结束时间
                    if (DateUtils.convertDateHMS(eav.getEndDate()).getTime() > tEndDate.getTime()) {
                        workHours = DateUtils.getIntervalHours(tStartDate, tEndDate);
                    } else {
                        workHours = DateUtils.getIntervalHours(tStartDate, DateUtils.convertDateHMS(eav.getEndDate()));
                    }
                }
                
                // 2.2 如果等于1，则为跨越1天的工作，工作结束时间-起始时间-11小时（17点到9点为11个小时）
                if (DateUtils.getIntervalDays(startDayByMonth, eavEndDate) == 1) {
                    // 第一天的默认工作起始时间，带时分秒
                    Date tStartDate = DateUtils.convertDateHMS((sdf.format(startDayByMonth) + workStartTime));
                    
                    // 第一天的默认工作结束时间，带时分秒
                    Date tEndDate = DateUtils.convertDateHMS(sdf.format(eavStartDate) + workEndTime);
                    
                    // 第二天的默认工作起始时间，带时分秒
                    Date t2StartDate = DateUtils.convertDateHMS(sdf.format(eavEndDate) + workStartTime);
                    
                    // 第二天的默认工作结束时间，带时分秒
                    Date t2EndDate = DateUtils.convertDateHMS(sdf.format(eavEndDate) + workEndTime);
                    
                    // 2.2.1 判断结束时间是否在正常工作时间内,如果实际工作结束时间大于默认工作时间，则取默认工作的结束时间
                    if (DateUtils.convertDateHMS(eav.getEndDate()).getTime() > t2EndDate.getTime()) {
                        workHours = 8;
                        /**
                         * set，8小时到startDayByMonth第一天的数据到ExportEmailSend中
                         */
                        
                        workHours = 8;
                        /**
                         * set，8小时到DateUtils.convertDate(eav.getEndDate())第二天的ExportEmailSend中
                         */
                        
                    }
                    // 2.2.2 实际工作结束时间，在第二天的默认工作时间内
                    if (DateUtils.convertDateHMS(eav.getEndDate()).getTime() <= t2EndDate.getTime() && DateUtils.convertDateHMS(eav.getEndDate()).getTime() > t2StartDate.getTime()){
                        workHours = DateUtils.getIntervalHours(tStartDate, DateUtils.convertDateHMS(eav.getEndDate()));
                        /**
                         * set，8小时到startDayByMonth第一天的数据到ExportEmailSend中
                         */
                        
                        workHours = workHours - 11 - 8;
                        /**
                         * set，workHours到DateUtils.convertDate(eav.getEndDate())第二天的ExportEmailSend中
                         */
                        
                    }
                    
                    // 2.2.3 实际工作时间，在第二天的默认工作开始时间之前，例如加班到凌晨
                    if (DateUtils.convertDateHMS(eav.getEndDate()).getTime() < t2StartDate.getTime()) {
                        workHours = 8;
                        
                        /**
                         * set，8小时到startDayByMonth第一天的数据到ExportEmailSend中
                         */
                    }
                }
                
                // 2.3 如果大于1，则为跨越N天的工作，工作结束时间-起始时间-11*N小时（17点到9点为11个小时）
                if (DateUtils.getIntervalDays(startDayByMonth, eavEndDate) > 1){
                    
                    Calendar cal = Calendar.getInstance();
                    
                    // 间隔天数
                    int jianDays = DateUtils.getIntervalDays(startDayByMonth, eavEndDate);
                    
                    // 第一天的默认工作起始时间，带时分秒
                    Date tStartDate = DateUtils.convertDateHMS((sdf.format(startDayByMonth) + workStartTime));
                    
                    // 第一天的默认工作结束时间，带时分秒
                    Date tEndDate = DateUtils.convertDateHMS(sdf.format(eavStartDate) + workEndTime);
                    
                    // 最后一天的默认工作起始时间，带时分秒
                    Date t2StartDate = DateUtils.convertDateHMS(sdf.format(eavEndDate) + workStartTime);
                    
                    // 最后一天的默认工作结束时间，带时分秒
                    Date t2EndDate = DateUtils.convertDateHMS(sdf.format(eavEndDate) + workEndTime);
                    
                    // 2.3.1 判断结束时间是否在正常工作时间内,如果实际工作结束时间大于默认工作时间，则取默认工作的结束时间
                    if (DateUtils.convertDateHMS(eav.getEndDate()).getTime() > t2EndDate.getTime()) {
                        
                        // 遍历第一天到第N天，每天都为8小时
                        cal.setTime(DateUtils.convertDate(sdf.format(tStartDate)));
                        
                        for (int j = 0; j <= jianDays; j++) {
                            cal.roll(Calendar.DATE, j);
                            Date evetyDay = cal.getTime();
                            workHours = 8;
                            /**
                             * set 8小时到everyDay每天的数据到ExportEmailSend中
                             */
                        }
                    }
                    // 2.3.2 实际工作结束时间，在第二天的默认工作时间内
                    if (DateUtils.convertDateHMS(eav.getEndDate()).getTime() <= t2EndDate.getTime() && DateUtils.convertDateHMS(eav.getEndDate()).getTime() > t2StartDate.getTime()){
                        // 总小时数
                        workHours = DateUtils.getIntervalHours(tStartDate, DateUtils.convertDateHMS(eav.getEndDate()));
                        
                        // 遍历第一天到第N-1天，每天都为8小时
                        cal.setTime(DateUtils.convertDate(sdf.format(tStartDate)));
                        
                        for (int j = 0; j < jianDays; j++) {
                            
                            if (j != jianDays) {
                                cal.roll(Calendar.DATE, j);
                                Date evetyDay = cal.getTime();
                                workHours = 8;
                                /**
                                 * set 8小时到everyDay每天的数据到ExportEmailSend中
                                 */
                            } else {
                                // 总小时数-11小时×N个晚上-8×（N-1）白天
                                workHours = jianDays * 11 - 8 * (jianDays-1);
                                /**
                                 * set，workHours到DateUtils.convertDate(eav.getEndDate())第二天的ExportEmailSend中
                                 */
                            }
                        }
                    }
                    
                    // 2.3.3 实际工作时间，在第二天的默认工作开始时间之前，例如加班到凌晨
                    if (DateUtils.convertDateHMS(eav.getEndDate()).getTime() < t2StartDate.getTime()) {
                        
                        // 遍历第一天到第N-1天，每天都为8小时
                        cal.setTime(DateUtils.convertDate(sdf.format(tStartDate)));
                        
                        for (int j = 0; j < jianDays; j++) {
                            cal.roll(Calendar.DATE, j);
                            Date evetyDay = cal.getTime();
                            workHours = 8;
                            /**
                             * set 8小时到everyDay每天的数据到ExportEmailSend中
                             */
                        }
                    }
                }
            }
            
            // 3、事件结束时间大于当月结束时间；事件起始时间在当月内，也就是大于当月起始时间，小于当月结束时间。
            if (eavStartDate.getTime() < endDayByMonth.getTime()&& eavStartDate.getTime() >= eavStartDate.getTime() && eavEndDate.getTime() > endDayByMonth.getTime()) {
                // 工时取：事件起始时间————当月默认结束时间
                
                // 3.1 判断时间间隔为多少天,如果等于0，为当天工作
                if (DateUtils.getIntervalDays(eavStartDate, endDayByMonth) == 0){
                    Date tStartDate = DateUtils.convertDateHMS((sdf.format(eavStartDate) + workStartTime));
                    Date tEndDate = DateUtils.convertDateHMS(sdfHMS.format(endDayByMonth) + workEndTime);
                    
                    // 判断起始时间是否在默认工作时间内,如果工作起始时间大于默认工作时间，则取正常工作的结束时间
                    if (DateUtils.convertDateHMS(eav.getEndDate()).getTime() > tEndDate.getTime()) {
                        workHours = DateUtils.getIntervalHours(tStartDate, tEndDate);
                    } else {
                        workHours = DateUtils.getIntervalHours(tStartDate, DateUtils.convertDateHMS(eav.getEndDate()));
                    }
                }
                
                // 3.2 如果等于1，则为跨越1天的工作，工作结束时间-起始时间-11小时（17点到9点为11个小时）
                if (DateUtils.getIntervalDays(startDayByMonth, eavEndDate) == 1) {
                    // 第一天的默认工作起始时间，带时分秒
                    Date tStartDate = DateUtils.convertDateHMS((sdf.format(startDayByMonth) + workStartTime));
                    
                    // 第一天的默认工作结束时间，带时分秒
                    Date tEndDate = DateUtils.convertDateHMS(sdf.format(eavStartDate) + workEndTime);
                    
                    // 第二天的默认工作起始时间，带时分秒
                    Date t2StartDate = DateUtils.convertDateHMS(sdf.format(eavEndDate) + workStartTime);
                    
                    // 第二天的默认工作结束时间，带时分秒
                    Date t2EndDate = DateUtils.convertDateHMS(sdf.format(eavEndDate) + workEndTime);
                    
                    // 3.2.1 判断结束时间是否在正常工作时间内,如果实际工作结束时间大于默认工作时间，则取默认工作的结束时间
                    if (DateUtils.convertDateHMS(eav.getEndDate()).getTime() > t2EndDate.getTime()) {
                        workHours = 8;
                        /**
                         * set，8小时到startDayByMonth第一天的数据到ExportEmailSend中
                         */
                        
                        workHours = 8;
                        /**
                         * set，8小时到DateUtils.convertDate(eav.getEndDate())第二天的ExportEmailSend中
                         */
                        
                    }
                    // 3.2.2 实际工作结束时间，在第二天的默认工作时间内
                    if (DateUtils.convertDateHMS(eav.getEndDate()).getTime() <= t2EndDate.getTime() && DateUtils.convertDateHMS(eav.getEndDate()).getTime() > t2StartDate.getTime()){
                        workHours = DateUtils.getIntervalHours(tStartDate, DateUtils.convertDateHMS(eav.getEndDate()));
                        /**
                         * set，8小时到startDayByMonth第一天的数据到ExportEmailSend中
                         */
                        
                        workHours = workHours - 11 - 8;
                        /**
                         * set，workHours到DateUtils.convertDate(eav.getEndDate())第二天的ExportEmailSend中
                         */
                        
                    }
                    
                    // 3.2.3 实际工作时间，在第二天的默认工作开始时间之前，例如加班到凌晨
                    if (DateUtils.convertDateHMS(eav.getEndDate()).getTime() < t2StartDate.getTime()) {
                        workHours = 8;
                        
                        /**
                         * set，8小时到startDayByMonth第一天的数据到ExportEmailSend中
                         */
                    }
                }
                
                // 3.3 如果大于1，则为跨越N天的工作，工作结束时间-起始时间-11*N小时（17点到9点为11个小时）
                if (DateUtils.getIntervalDays(startDayByMonth, eavEndDate) > 1){
                    
                    Calendar cal = Calendar.getInstance();
                    
                    // 间隔天数
                    int jianDays = DateUtils.getIntervalDays(startDayByMonth, eavEndDate);
                    
                    // 第一天的默认工作起始时间，带时分秒
                    Date tStartDate = DateUtils.convertDateHMS((sdf.format(startDayByMonth) + workStartTime));
                    
                    // 第一天的默认工作结束时间，带时分秒
                    Date tEndDate = DateUtils.convertDateHMS(sdf.format(eavStartDate) + workEndTime);
                    
                    // 最后一天的默认工作起始时间，带时分秒
                    Date t2StartDate = DateUtils.convertDateHMS(sdf.format(eavEndDate) + workStartTime);
                    
                    // 最后一天的默认工作结束时间，带时分秒
                    Date t2EndDate = DateUtils.convertDateHMS(sdf.format(eavEndDate) + workEndTime);
                    
                    // 3.3.1 判断结束时间是否在正常工作时间内,如果实际工作结束时间大于默认工作时间，则取默认工作的结束时间
                    if (DateUtils.convertDateHMS(eav.getEndDate()).getTime() > t2EndDate.getTime()) {
                        
                        // 遍历第一天到第N天，每天都为8小时
                        cal.setTime(DateUtils.convertDate(sdf.format(tStartDate)));
                        
                        for (int j = 0; j <= jianDays; j++) {
                            cal.roll(Calendar.DATE, j);
                            Date evetyDay = cal.getTime();
                            workHours = 8;
                            /**
                             * set 8小时到everyDay每天的数据到ExportEmailSend中
                             */
                        }
                    }
                    // 3.3.2 实际工作结束时间，在第二天的默认工作时间内
                    if (DateUtils.convertDateHMS(eav.getEndDate()).getTime() <= t2EndDate.getTime() && DateUtils.convertDateHMS(eav.getEndDate()).getTime() > t2StartDate.getTime()){
                        // 总小时数
                        workHours = DateUtils.getIntervalHours(tStartDate, DateUtils.convertDateHMS(eav.getEndDate()));
                        
                        // 遍历第一天到第N-1天，每天都为8小时
                        cal.setTime(DateUtils.convertDate(sdf.format(tStartDate)));
                        
                        for (int j = 0; j < jianDays; j++) {
                            
                            if (j != jianDays) {
                                cal.roll(Calendar.DATE, j);
                                Date evetyDay = cal.getTime();
                                workHours = 8;
                                /**
                                 * set 8小时到everyDay每天的数据到ExportEmailSend中
                                 */
                            } else {
                                // 总小时数-11小时×N个晚上-8×（N-1）白天
                                workHours = jianDays * 11 - 8 * (jianDays-1);
                                /**
                                 * set，workHours到DateUtils.convertDate(eav.getEndDate())第二天的ExportEmailSend中
                                 */
                            }
                        }
                    }
                    
                    // 3.3.3 实际工作时间，在第二天的默认工作开始时间之前，例如加班到凌晨
                    if (DateUtils.convertDateHMS(eav.getEndDate()).getTime() < t2StartDate.getTime()) {
                        
                        // 遍历第一天到第N-1天，每天都为8小时
                        cal.setTime(DateUtils.convertDate(sdf.format(tStartDate)));
                        
                        for (int j = 0; j < jianDays; j++) {
                            cal.roll(Calendar.DATE, j);
                            Date evetyDay = cal.getTime();
                            workHours = 8;
                            /**
                             * set 8小时到everyDay每天的数据到ExportEmailSend中
                             */
                        }
                    }
                }
            }
            
            // 4、事件包含整月
            if (eavStartDate.getTime() < startDayByMonth.getTime() && eavEndDate.getTime() > endDayByMonth.getTime()) {
                // 工时取：事件的起始时间和结束时间
                
                
            }
            
            allEvents.get(i);
            
            // 判断是否为节假日的BudgeCenter
            
            // 判断是否为BudgeCenter
            
            
            
        }
    }
}
